#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h> // for signal()
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>

int cnt = 0;
void cleanup(int sig) // 函数头是固定，是回调函数
{
    pid_t pid;
    int status;
    while(1)
    { 
        // 查看是否有进入僵尸态的子进程，若有直接回收，若没有直接退出
        if (waitpid(-1, &status, WNOHANG) > 0)
        {
            if (WIFEXITED(status))//判断子进程是否正常退出
            {
                //输出进程的退出状态
                printf("child exited with status %d\n", WEXITSTATUS(status));
            }
        }
        else
            break;
    }
}

int main(int argc, char const *argv[])
{
    int n;
    //将子进程的退出信号与cleanup绑定
    //当收到SIGCHLD时释放子进程的资源
    signal(SIGCHLD, cleanup);
    scanf("%d", &n);
    // 产生n个子进程
    pid_t a;
    for(int i=0; i<n; i++)
    {
        a = fork();
        if(a > 0)
        {
            printf("%d已创建\n", a);
            continue;
        }
        else 
            break;
    }
    if(a > 0)
    {
        
        while(1)
            pause();
    }
    // 子进程直接退出变成僵尸，默认会自动向父进程发送 SIGCHILD
    return 0;
}
